// 此程序是开发框架的ftp客户端工具的类的声明文件。
#ifndef __FTP_H
#define __FTP_H

#include "./_public.h"
#include "_ftplib.h"

namespace idc
{
    class cftpclient
    {
    private:
        netbuf *m_ftpcoon; // ftp服务的连接句柄
    public:
        string m_mtime;       // 最后一次进行文件修改的时间
        unsigned int m_msize;       // 最后一次进行文件修改的大小
        // 下面是用来存放ftp登录可能出现的问题
        bool m_connetfailed;                                // 网络连接失败
        bool m_loginfailed;                                 // 登录失败(用户名/密码错误或是没有登录权限)
        bool m_optionfailed;                                // 设置传输模式失败
        cftpclient();                                       // 构造函数
        ~cftpclient();                                      // 析构函数
        cftpclient(const cftpclient &) = delete;            // 禁止拷贝构造函数
        cftpclient &operator=(const cftpclient &) = delete; // 禁止赋值操作符
        void initdata();                                    // 初始化数据

        // 登录ftp服务器
        // host:ftp服务器的ip地址与端口号，如:127.0.0.1:21
        // username:用户名
        // password:密码
        // fmode:传输模式，默认为被动模式
        bool login(const string &host, const string &username, const string &password, const int fmode =FTPLIB_PASSIVE);

        // 断开连接
        bool loginout();

        // 获取ftp服务器上文件的大小
        bool size(const string& remotefile);

        // 获取ftp服务器上文件的时间
        //// 返回值：false-失败；true-成功，获取到的文件大小存放在m_mtime成员变量中。
        bool mtime(const string &filename);

        // 修改ftp服务器的工作目录
        // 返回值: false-失败；true-成功
        bool chdir(const string &dir);

        // 在ftp服务器上创建目录
        // 返回值: false-失败；true-成功
        bool mkdir(const string &dir);

        // 删除ftp服务器上的目录
        // 返回值: false-失败；true-成功
        bool rmdir(const string &dir);

        // 发送NLST命令列出ftp服务器目录中的子目录名和文件名。
        // remotedir：ftp服务器的目录名。
        // listfilename：用于保存从服务器返回的目录和文件名列表。
        // 返回值：true-成功；false-失败。
        // 注意：如果列出的是ftp服务器当前目录，remotedir用"","*","."都可以，但是，不规范的ftp服务器可能有差别。
        bool nlst(const string &remotedir, const string &listfilename);

        // 从ftp服务器上获取文件。
        // remotefilename：待获取ftp服务器上的文件名。
        // localfilename：保存到本地的文件名。
        // bcheckmtime：文件传输完成后，是否核对远程文件传输前后的时间，保证文件的完整性。
        // 返回值：true-成功；false-失败。
        // 注意：文件在传输的过程中，采用临时文件命名的方法，即在localfilename后加".tmp"，在传输
        // 完成后才正式改为localfilename。
        bool get(const string &remotefilename, const string &localfilename,const bool bcheckname = true);

        // 向ftp服务器发送文件。
        // localfilename：本地待发送的文件名。
        // remotefilename：发送到ftp服务器上的文件名。
        // bchecksize：文件传输完成后，是否核对本地文件和远程文件的大小，保证文件的完整性。
        // 返回值：true-成功；false-失败。
        // 注意：文件在传输的过程中，采用临时文件命名的方法，即在remotefilename后加".tmp"，在传输
        // 完成后才正式改为remotefilename。
        bool put(const string &localfilename, const string &remotefilename,const bool bcheckname = true);

        //删除ftp服务器上的文件
        //返回值:true-成功；false-失败。
        bool deletefile(const string &remotefilename);

        //重命名ftp服务器上的文件
        //返回值:true-成功；false-失败。
        bool rename(const string &oldfilename, const string &newfilename);

        //向ftp服务器发送site命令
        //command:命令的具体内容
        //返回值:true-成功；false-失败。
        bool site(const string &command);

        //获取服务器返回信息的最后一条
        char* response();
    };
};

#endif // __FTP_H
